package cevent.source.cloudcenter.server.service;

import cevent.source.cloudcenter.server.domain.File;
import cevent.source.cloudcenter.server.domain.FileExample;
import cevent.source.cloudcenter.server.dto.FileDto;
import cevent.source.cloudcenter.server.dto.PageDto;
import cevent.source.cloudcenter.server.enums.ModuleTypeEnum;
import cevent.source.cloudcenter.server.mapper.ArticleMapper;
import cevent.source.cloudcenter.server.mapper.FileMapper;
import cevent.source.cloudcenter.server.util.DuplicateUtil;
import cevent.source.cloudcenter.server.util.UUID8Util;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author cevent
 * @description 文件资源管理表服务层
 */
@Service
public class FileService {
    private static final Logger LOG=LoggerFactory.getLogger(FileService.class);
    @Resource
    private FileMapper fileMapper;
    @Resource
    private ArticleMapper articleMapper;

    //1.无分页列表查询：dto获取domain参数
    public List<FileDto> fileDtoList(){
        FileExample fileExample = new FileExample();
        fileExample.setOrderByClause("uni_id asc");
        List<File> fileList=fileMapper.selectByExample(fileExample);
        List<FileDto> fileDtoList = new ArrayList<FileDto>();
        for(int i=0;i<fileList.size();i++){
            File file=fileList.get(i);
            FileDto fileDto=new FileDto();
            //复制拷贝(source,target)
            BeanUtils.copyProperties(file,fileDto);
            fileDtoList.add(fileDto);
        }
        return fileDtoList;
    }

    /*2.分页查询：pageDto保存数据
        list数据集合：listPageData
        当前页码：currentPage
        每页行数：size
        总计函数：totalSize
        前端可返回pageDto，无需返回值
     */
    public void getFilePageDtoList(PageDto pageDto){
        //1.分页设置（前端传入当前页和每页行数params），起始页，每页行数size
        PageHelper.startPage(pageDto.getCurrentPage(),pageDto.getSize());

        FileExample fileExample=new FileExample();


        List<File> fileList=fileMapper.selectByExample(fileExample);
        //2.将mapper查询结果复制到pageInfo
        PageInfo<File> pageInfo=new PageInfo<>(fileList);
        //3.pageInfo计算处理处理=>后分页的总行数set到pageDto做记录
        pageDto.setTotalSize(pageInfo.getTotal());

        List<FileDto> fileDtoList=new ArrayList<>();
        fileList.stream().forEach(file->{
            FileDto fileDto=new FileDto();
            BeanUtils.copyProperties(file,fileDto);
            fileDtoList.add(fileDto);
        });

        pageDto.setListPageData(fileDtoList);

    }

    //3.新增、修改file，将传入的id转为file对象本身
    public void save(FileDto fileDto){
        File file= DuplicateUtil.copy(fileDto,File.class);
        File fileDB=selectByShardKey(fileDto.getShardKey());
        if(fileDB==null){
            this.insert(file);
        }else{
            //如果fileDB不为空，只更新shardIndex
            fileDB.setShardIndex(fileDto.getShardIndex());
            this.update(fileDB);
        }

    }

    //4.删除模块
    public void delete(String uniId){
        FileExample fileExample=new FileExample();
        fileMapper.deleteByPrimaryKey(uniId);
        //TODO 调用article删除数据库数据
    }

    //5.向外暴露dto，不暴露实体类：插入数据
    private void insert(File file){
        file.setUniId(UUID8Util.getShortUUID());
        if(file.getModuleId()==null){
            file.setModuleId("0");
        }
        if(file.getTypeId()==null){
            file.setTypeId(ModuleTypeEnum.BASE_MODULE.getCode());
        }

        try {
        Date now =new Date();
        String date=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(now);
        long time=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date).getTime();
        int timeInt=(int)(time/1000);
        file.setCreateTime(now);
        file.setUpdateTime(now);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        //multipartFile文件类型，这里不使用普通insert方法
        fileMapper.insertSelective(file);
    }

    //6.更新模块
    private void update(File file){
        try {
            Date now =new Date();
            String date=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(now);
            long time=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date).getTime();
            int timeInt=(int)(time/1000);

            file.setUpdateTime(now);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        fileMapper.updateByPrimaryKeySelective(file);
    }

    //7.根据传入的moduleId查询file文件列表
    public List<FileDto> listByModuleId(String moduleId){
        FileExample fileExample=new FileExample();
        FileExample.Criteria criteria=fileExample.createCriteria();
        criteria.andModuleIdEqualTo(moduleId);
        List<File> files=fileMapper.selectByExample(fileExample);
        return DuplicateUtil.copyList(files,FileDto.class);
    }
    //8.分片上传：根据shardKey查询是否存在文件未上传完毕
    public File selectByShardKey(String shardKey){
        FileExample fileExample=new FileExample();
        fileExample.createCriteria().andShardKeyEqualTo(shardKey);
        List<File> files=fileMapper.selectByExample(fileExample);
        if(CollectionUtils.isEmpty(files)){
            return null;
        }else{
            //返回第一个文件对象
            return files.get(0);
        }
    }
    //9.根据shardKey查询是否已上传，查看shardIndex开始分片续传
    public FileDto getByShardKey(String shardKey){
        return DuplicateUtil.copy(selectByShardKey(shardKey),FileDto.class);
    }
}
